package com.github.dongglin.smart.spring.boot.plus.core.framework.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.dongglin.smart.spring.boot.plus.core.framework.pager.BasePageQuery;
import com.github.dongglin.smart.spring.boot.plus.core.framework.pager.PageResult;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @param <T> entity
 * @author DongGL
 * @Description: 通用 BaseService
 * @date 2023/9/20 16:00
 */
@SuppressWarnings({"DuplicatedCode", "unused"})
public interface OptionalMPJBaseService<T> extends IService<T> {

    /**
     * @param basePageQuery 分页参数
     */
    void handlePage(BasePageQuery basePageQuery);

    /**
     * 处理分页
     *
     * @param basePageQuery  分页参数
     * @param defaultOrderBy 排序
     */
    void handlePage(BasePageQuery basePageQuery, String defaultOrderBy);

    /**
     * 根据 Wrapper 条件，查询总记录数 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return long
     */
    Long getCountOptionalOrElseThrow(Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件，查询总记录数 如果不存在抛出对象不存在 返回0
     *
     * @param queryWrapper 实体对象封装操作类
     * @return long
     */
    Long getCountOptionalOrElseZero(Wrapper<T> queryWrapper);

    /**
     * 查询指定字段值数量 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field field
     * @param value value
     * @return long
     */
    Long selectCountOptionalOrElseThrow(String field, Object value);

    /**
     * 查询指定字段值数量 查询总记录数 如果不存在抛出对象不存在 返回0
     *
     * @param field field
     * @param value value
     * @return long
     */
    Long selectCountOptionalOrElseZero(String field, Object value);

    /**
     * 查询指定字段值数量 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field field
     * @param value value
     * @return long
     */
    Long selectCountOptionalOrElseThrow(SFunction<T, ?> field, Object value);

    /**
     * 查询指定字段值数量 如果不存在抛出对象不存在 返回0
     *
     * @param field field
     * @param value value
     * @return long
     */
    Long selectCountOptionalOrElseZero(SFunction<T, ?> field, Object value);

    /**
     * 根据 ID 查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param id 主键ID
     * @return T
     */
    T getByIdOptionalOrElseThrow(Serializable id);

    /**
     * 根据 ID 查询返回viewObject 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param id      主键ID
     * @param voClass 需要绑定的对象类型
     * @param <VO>    返回值类型
     * @return VO
     */
    <VO> VO getByIdViewObjectOptionalOrElseThrow(Serializable id, Class<VO> voClass);

    /**
     * 根据 entity 条件，查询一条记录  如果不存在抛出对象不存在 @QueryNotFoundException
     * <p>查询一条记录，例如 qw.last("limit 1") 限制取一条记录, 注意：多条数据会报异常</p>
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return T
     */
    T getOneOptionalOrElseThrow(Wrapper<T> queryWrapper);

    /**
     * 根据 ID 查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param voClass      需要绑定的对象类型
     * @param <VO>         返回值类型
     * @return T VO
     */
    <VO> VO getViewObjectOptionalOrElseThrow(Wrapper<T> queryWrapper, Class<VO> voClass);

    /**
     * 查询一个
     *
     * @param field field
     * @param value value
     * @return T
     */
    T getOneOptionalOrElseThrow(String field, Object value);

    /**
     * 根据 ID 查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field   field
     * @param value   value
     * @param voClass 需要绑定的对象类型
     * @param <VO>    返回值类型
     * @return VO
     */
    <VO> VO getOneViewObjectOptionalOrElseThrow(String field, Object value, Class<VO> voClass);

    /**
     * 查询一个
     *
     * @param field field
     * @param value value
     * @return T
     */
    T getOneOptionalOrElseThrow(SFunction<T, ?> field, Object value);

    /**
     * 查询一个
     *
     * @param field   field
     * @param value   value
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return VO
     */
    <VO> VO getOneViewObjectOptionalOrElseThrow(SFunction<T, ?> field, Object value, Class<VO> voClass);


    /**
     * 查询一个
     *
     * @param field1 field1
     * @param value1 value1
     * @param field2 field2
     * @param value2 value2
     * @return T
     */
    T getTwoOptionalOrElseThrow(String field1, Object value1, String field2, Object value2);

    /**
     * 查询一个
     *
     * @param field1  field1
     * @param value1  value1
     * @param field2  field2
     * @param value2  value2
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return VO
     */
    <VO> VO getOneViewObjectOptionalOrElseThrow(String field1, Object value1, String field2, Object value2, Class<VO> voClass);

    /**
     * 查询一个
     *
     * @param field1 field1
     * @param value1 value1
     * @param field2 field2
     * @param value2 value2
     * @return T
     */
    T getTwoOptionalOrElseThrow(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2);

    /**
     * 查询一个
     *
     * @param field1  field1
     * @param value1  value1
     * @param field2  field2
     * @param value2  value2
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return VO
     */
    <VO> VO getTwoOptionalOrElseThrow(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2, Class<VO> voClass);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     * @return list<T>
     */
    List<T> listBatchIdsOptionalOrElseThrow(Collection<? extends Serializable> idList);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param idList  主键ID列表(不能为 null 以及 empty)
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listBatchIdsViewOptionalOrElseThrow(Collection<? extends Serializable> idList, Class<VO> voClass);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 返回empty
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     * @return list<T>
     */
    List<T> listBatchIdsOptionalOrElseEmpty(Collection<? extends Serializable> idList);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 返回empty
     *
     * @param idList  主键ID列表(不能为 null 以及 empty)
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listBatchIdsViewOptionalOrElseEmpty(Collection<? extends Serializable> idList, Class<VO> voClass);

    /**
     * 根据 entity 条件，查询全部记录 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list<T>
     */
    List<T> listOptionalOrElseThrow(Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件，查询全部记录 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param voClass      返回值类型
     * @param <VO>         返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseThrow(Wrapper<T> queryWrapper, Class<VO> voClass);

    /**
     * 根据 entity 条件，查询全部记录  如果不存在抛出对象不存在 返回empty
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list<T>
     */
    List<T> listOptionalOrElseEmpty(Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件，查询全部记录  如果不存在抛出对象不存在 返回empty
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param voClass      返回值类型
     * @param <VO>         返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseEmpty(Wrapper<T> queryWrapper, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field field
     * @param value value
     * @return list<T>
     */
    List<T> listOptionalOrElseThrow(String field, Object value);


    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field   field
     * @param value   value
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseThrow(String field, Object value, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field field
     * @param value value
     * @return list<T>
     */
    List<T> listOptionalOrElseEmpty(String field, Object value);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field   field
     * @param value   value
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseEmpty(String field, Object value, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException *
     *
     * @param field field
     * @param value value
     * @return list<T>
     */
    List<T> listOptionalOrElseThrow(SFunction<T, ?> field, Object value);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException *
     *
     * @param field   field
     * @param value   value
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseThrow(SFunction<T, ?> field, Object value, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty *
     *
     * @param field field
     * @param value value
     * @return list<T>
     */
    List<T> listOptionalOrElseEmpty(SFunction<T, ?> field, Object value);


    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty *
     *
     * @param field   field
     * @param value   value
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseEmpty(SFunction<T, ?> field, Object value, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException *
     *
     * @param field  field
     * @param values values
     * @return list<T>
     */
    List<T> listOptionalOrElseThrow(String field, Collection<?> values);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException *
     *
     * @param field   field
     * @param values  values
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseThrow(String field, Collection<?> values, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在  返回empty
     *
     * @param field  field
     * @param values values
     * @return list<T>
     */
    List<T> listOptionalOrElseEmpty(String field, Collection<?> values);

    /**
     * 列表查询 如果不存在抛出对象不存在  返回empty
     *
     * @param field   field
     * @param values  values
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseEmpty(String field, Collection<?> values, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field  field
     * @param values values
     * @return list<T>
     */
    List<T> listOptionalOrElseThrow(SFunction<T, ?> field, Collection<?> values);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field   field
     * @param values  values
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseThrow(SFunction<T, ?> field, Collection<?> values, Class<VO> voClass);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty *
     *
     * @param field  field
     * @param values values
     * @return list<T>
     */
    List<T> listOptionalOrElseEmpty(SFunction<T, ?> field, Collection<?> values);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty *
     *
     * @param field   field
     * @param values  values
     * @param voClass 返回值类型
     * @param <VO>    返回值类型
     * @return list<VO>
     */
    <VO> List<VO> listViewOptionalOrElseEmpty(SFunction<T, ?> field, Collection<?> values, Class<VO> voClass);


    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param columnMap 表字段 map 对象
     * @return list<T>
     */
    List<T> listByMapsOptionalOrElseThrow(Map<String, Object> columnMap);


    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param columnMap 表字段 map 对象
     * @param voClass   返回值类型
     * @param <VO>      vo
     * @return list<VO>
     */
    <VO> List<VO> listViewByMapsOptionalOrElseThrow(Map<String, Object> columnMap, Class<VO> voClass);

    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 返回empty
     *
     * @param columnMap 表字段 map 对象
     * @return list<T>
     */
    List<T> listByMapsOptionalOrElseEmpty(Map<String, Object> columnMap);

    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 返回empty
     *
     * @param columnMap 表字段 map 对象
     * @param voClass   返回值类型
     * @param <VO>      vo
     * @return list<VO>
     */
    <VO> List<VO> listViewByMapsOptionalOrElseEmpty(Map<String, Object> columnMap, Class<VO> voClass);

    /**
     * 根据 Wrapper 条件，查询全部记录 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list<Map < String, Object>>
     */
    List<Map<String, Object>> mapsOptionalOrElseThrow(Wrapper<T> queryWrapper);


    /**
     * 根据 Wrapper 条件，查询全部记录  如果不存在抛出对象不存在 返回empty
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list<Map < String, Object>>
     */
    List<Map<String, Object>> mapsOptionalOrElseEmpty(Wrapper<T> queryWrapper);


    /**
     * 根据 Wrapper 条件，查询全部记录 如果不存在抛出对象不存在 @QueryNotFoundException
     * <p>注意： 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list<Object>
     */
    List<Object> listObjsOptionalOrElseThrow(Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件，查询全部记录 如果不存在抛出对象不存在 返回empty
     * <p>注意： 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list<Object>
     */
    List<Object> listObjsOptionalOrElseEmpty(Wrapper<T> queryWrapper);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param idList    主键ID列表(不能为 null 以及 empty)
     * @param pageQuery 分页查询对象(不能为 null )
     * @return PageResult<VO>
     */
    PageResult<T> pagerListBatchIdsOptionalOrElseThrow(Collection<? extends Serializable> idList, BasePageQuery pageQuery);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 返回empty
     *
     * @param idList    主键ID列表(不能为 null 以及 empty)
     * @param voClass   返回值类型
     * @param pageQuery 分页查询对象(不能为 null )
     * @param <VO>      vo
     * @return VO
     */
    <VO> PageResult<VO> pagerListBatchIdsViewOptionalOrElseThrow(Collection<? extends Serializable> idList, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 返回empty
     *
     * @param idList    主键ID列表(不能为 null 以及 empty)
     * @param pageQuery 分页查询对象(不能为 null )
     * @return PageResult<T>
     */
    PageResult<T> pagerListBatchIdsOptionalOrElseEmpty(Collection<? extends Serializable> idList, BasePageQuery pageQuery);

    /**
     * 查询（根据ID 批量查询） 如果不存在抛出对象不存在 返回empty
     *
     * @param idList    主键ID列表(不能为 null 以及 empty)
     * @param voClass   返回值类型
     * @param pageQuery 分页查询对象(不能为 null )
     * @param <VO>      vo
     * @return VO
     */
    <VO> PageResult<VO> pagerListBatchIdsViewOptionalOrElseEmpty(Collection<? extends Serializable> idList, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 根据 entity 条件，查询全部记录 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param pageQuery    分页查询对象(不能为 null )
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseThrow(Wrapper<T> queryWrapper, BasePageQuery pageQuery);

    /**
     * 根据 entity 条件，查询全部记录 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param voClass      返回值类型
     * @param pageQuery    分页查询对象(不能为 null )
     * @param <VO>         vo
     * @return vo
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseThrow(Wrapper<T> queryWrapper, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 根据 entity 条件，查询全部记录  如果不存在抛出对象不存在 返回empty
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param pageQuery    分页查询对象(不能为 null )
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseEmpty(Wrapper<T> queryWrapper, BasePageQuery pageQuery);

    /**
     * 根据 entity 条件，查询全部记录  如果不存在抛出对象不存在 返回empty
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param voClass      返回值类型
     * @param pageQuery    分页查询对象(不能为 null ) *
     * @param <VO>         vo
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseEmpty(Wrapper<T> queryWrapper, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     field
     * @param value     value
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseThrow(String field, Object value, BasePageQuery pageQuery);


    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     field
     * @param value     value
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseThrow(String field, Object value, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field     field
     * @param value     value
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseEmpty(String field, Object value, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field     field
     * @param value     value
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseEmpty(String field, Object value, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     f
     * @param value     v
     * @param pageQuery q
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseThrow(SFunction<T, ?> field, Object value, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException *
     *
     * @param field     f
     * @param value     v
     * @param voClass   v
     * @param pageQuery q
     * @param <VO>      vo
     * @return vo
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseThrow(SFunction<T, ?> field, Object value, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field     field
     * @param value     value
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseEmpty(SFunction<T, ?> field, Object value, BasePageQuery pageQuery);


    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field     field
     * @param value     value
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseEmpty(SFunction<T, ?> field, Object value, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     field
     * @param values    values
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseThrow(String field, Collection<?> values, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     field
     * @param values    values
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseThrow(String field, Collection<?> values, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在  返回empty
     *
     * @param field     field
     * @param values    values
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseEmpty(String field, Collection<?> values, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在  返回empty
     *
     * @param field     field
     * @param values    values
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListOptionalOrElseEmpty(String field, Collection<?> values, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     field
     * @param values    values
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseThrow(SFunction<T, ?> field, Collection<?> values, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param field     field
     * @param values    values
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseThrow(SFunction<T, ?> field, Collection<?> values, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field     field
     * @param values    values
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListOptionalOrElseEmpty(SFunction<T, ?> field, Collection<?> values, BasePageQuery pageQuery);

    /**
     * 列表查询 如果不存在抛出对象不存在 返回empty
     *
     * @param field     field
     * @param values    values
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewOptionalOrElseEmpty(SFunction<T, ?> field, Collection<?> values, Class<VO> voClass, BasePageQuery pageQuery);


    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param columnMap columnMap
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListByMapsOptionalOrElseThrow(Map<String, Object> columnMap, BasePageQuery pageQuery);


    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 @QueryNotFoundException
     *
     * @param columnMap columnMap
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewByMapsOptionalOrElseThrow(Map<String, Object> columnMap, Class<VO> voClass, BasePageQuery pageQuery);

    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 返回empty
     *
     * @param columnMap columnMap
     * @param pageQuery pageQuery
     * @return T
     */
    PageResult<T> pagerListByMapsOptionalOrElseEmpty(Map<String, Object> columnMap, BasePageQuery pageQuery);

    /**
     * 查询（根据 columnMap 条件） 如果不存在抛出对象不存在 返回empty
     *
     * @param columnMap columnMap
     * @param voClass   voClass
     * @param pageQuery pageQuery
     * @param <VO>      VO
     * @return VO
     */
    <VO> PageResult<VO> pagerListViewByMapsOptionalOrElseEmpty(Map<String, Object> columnMap, Class<VO> voClass, BasePageQuery pageQuery);


}
